/* new操作符做了什么：
1.创建一个空对象
2.把这个空对象继承构造函数的原型
3.执行构造函数，使用apply或者call改变this的指向，将this指向空对象
4.返回值为object类型则作为new方法的返回值返回，否则返回上述全新对象obj */

function Fun(name,age) {
    this.name = name;
    this.age = age;
    // return 111 如果return的是基本数据类型，那么返回的还是Fun的实例对象
    return { // 如果return的是引用类型，那么返回的就是该引用类型
        a: 11,
        b:22
    }
    return 222
};


function myNew(contrctor,...args) {
    // 实际上同等fn.__proto__ === Fun.prototype
    const newObj = Object.create(contrctor.prototype);
    const res = contrctor.apply(newObj,args);
    // console.log('res',res)
    // 如果res返回的是一个引用类型则直接取之，否则返回新的对象
    // if(typeof res === 'object') {
    //     return res
    // }else {
    //     return newObj
    // }
    return typeof res === 'object' ? res : newObj;
}
// const fn = new Fun('章三',18);
const fn = myNew(Fun,"张三",18)
console.log('fn',fn)
